package com.shujia.mllib

import org.apache.spark.ml.classification.{LogisticRegression, LogisticRegressionModel}
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}

object Demo3Person {
  def main(args: Array[String]): Unit = {
    val spark: SparkSession = SparkSession
      .builder()
      .master("local")
      .appName("line")
      .getOrCreate()

    import spark.implicits._
    import org.apache.spark.sql.functions._

    /**
      * 读取svm格式的数据
      * svm 格式是一种专门用于机器学习的数据格式，包含两部分，目标值，特征向量
      *
      */

    val data: DataFrame = spark
      .read
      .format("libsvm")
      .load("data/人体指标.txt")


    /**
      * 将数据拆分成训练数据和测试数据
      *
      */

    val split: Array[Dataset[Row]] = data.randomSplit(Array(0.8, 0.2))
    //训练数据
    val trainData: Dataset[Row] = split(0)
    //测试数据
    val testData: Dataset[Row] = split(1)


    //构建算法，训练模型
    val logisticRegression = new LogisticRegression()

    //将训练集带入算法训练模型
    val model: LogisticRegressionModel = logisticRegression.fit(trainData)


    /**
      * 将测试集带入模型测试模型的准确率
      *
      */

    val testDF: DataFrame = model.transform(testData)


    /**
      * 计算准确率
      *
      */
    val p: Double = testDF.where($"prediction" === $"label").count().toDouble / testDF.count()

    println(s"准确率：$p")

    /**
      * 保存模型
      * 将模型保存到hdfs
      *
      */

    model.write.overwrite().save("data/model")


  }

}
